#include <stdio.h>

//常量字符串，双引号引起的一串字符。自动追加了 '\0'
// NULL = 0;
// 可打印字符 从空格(32)开始 32-127

//大小 存储 进程空间的 data rodata

// C 语言如何处理常量字符串，将其编译为一个指向 rodata 一串字符的首地址。
// char *p = "China";

// 这个首地址能代表字符串 吗? 数组三要素？
// 首地址 + 步长 范围（自动追加了 '\0')


// 通过字符指针的方式，可以使用常量字符串，但是不能修改
// 修改内容

int main1()
{
//    int 1000; char 'a'; float 3.14;
    char *p = "China";
    printf("%s\n",p);
    printf("%s\n","China");
    return 0;
}


//    char ARR[6] = "China";
// 将 data rodata 的一串字符串，复制到了 ARR 代表的字符串中；
// 此时操作字符数组，等价于操作一个字符串。可以修改。

int main2()
{
    // 大小 步长
//    char ARR[6]; // "China"
//    printf("sizeof(ARR) = %d\t\n",sizeof (ARR));
//    printf("sizeof(\"China\") = %d\t\n",sizeof ("China"));

//    printf("ARR     = %p ARR + 1     = %p \t\n",ARR, ARR + 1);
//    printf("\"China\" = %p \"China\" + 1 = %p \t\n","China", "China" + 1);
    char ARR[6] = "China";
    printf("%s\n",ARR);
    printf("%s\n","China");
    ARR[2] = 'x';
    printf("%s\n",ARR);
}


// 是不是随便一个字符串，都可以放到字符数组中去呢？
// 等价 sizeof(字符数组的大小) >= sizeof(字符串的大小)


// 综上所述：对于一个字符串的处理，就变成了，对字符指针，或是对字符数组的处理。
// 下面要研究的是，一堆字符在一起构成的数据形态。
int main()
{
    // 输出 'Ch'
//    char ch[2] = "China";
    // 输出 'China'
//    char ch[6] = "China";
    // 自适应 输出 'China'
    char ch[] = "China";
    printf("%s\n",ch);

}
